/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.entity.Coordinacion;
import co.com.claro.administracionSolicitudes.entity.Gerencia;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author Mike
 */
@ManagedBean
@ViewScoped
public class CrearCoordinacionBean {

    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;
    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;
    /**
     * String que almacena el nombre de la coordinación
     */
    private String nombreCoordinacion;
    /**
     * Lista con las coordinaciones
     */
    private List<Coordinacion> coordinaciones;
    /**
     * Lista de los items para el select one menu
     */
    private List<SelectItem> gerenciasItems;
    /**
     * Objeto seleccionado del select one menu
     */
    private String gerenciaSeleccionado;
    /**
     * Objeto del data table seleccionado por el usuario
     */
    private Coordinacion coordinacionSeleccionada;
    /**
     * Variable que contiene el mensaje de error o confirmación de la acción
     * realizada por el usuario
     */
    private String mensaje;

    /**
     * Creates a new instance of CrearCoordinacionBean
     */
    public CrearCoordinacionBean() {
    }

    @PostConstruct
    public void inicializarValores() {
        List<Gerencia> gerencias;

        obtenerCoordinaciones();
        gerencias = localDatabase.findGerenciaByEstado(EstadoActividadEnum.ACTIVO.getId());

        if (gerenciasItems == null) {
            gerenciasItems = new ArrayList<SelectItem>();
        }
        for (Gerencia temporal : gerencias) {
            gerenciasItems.add(new SelectItem(temporal.getIdGerencia(), temporal.getNombre()));
        }
    }

    //************************** EVENTOS PROPIOS DEL EJB ************************
    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void crearCoordinacion() {
        if (isCamposInvalidos()) {
            return;
        }

        Coordinacion coordinacion = new Coordinacion();

        coordinacion.setNombre(nombreCoordinacion);
        coordinacion.setIdGerencia(new Gerencia(Short.parseShort(gerenciaSeleccionado)));
        coordinacion.setActivo(EstadoActividadEnum.ACTIVO.getId());
        coordinacion.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.crearCoordinacion(coordinacion);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearAplicacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerCoordinaciones();
        borrarCampos();
    }

    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void modificarCoordinacion(ActionEvent event) {
        if (isCamposInvalidos()) {
            return;
        }

        coordinacionSeleccionada.setNombre(nombreCoordinacion);
        coordinacionSeleccionada.setIdGerencia(new Gerencia(Short.parseShort(gerenciaSeleccionado)));
        coordinacionSeleccionada.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.modificarCoordinacion(coordinacionSeleccionada);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearAplicacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerCoordinaciones();
        borrarCampos();
    }

    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void eliminarCoordinacion(ActionEvent event) {
        coordinacionSeleccionada = obtenerObjeto(event);

        coordinacionSeleccionada.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.borradoLogicoCoordinacion(coordinacionSeleccionada);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearAplicacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerCoordinaciones();
        borrarCampos();
    }

    /**
     * Método que obtiene las coordinaciones almacenadas en base de datos
     */
    private void obtenerCoordinaciones() {
        coordinaciones = localDatabase.findCoordinacionByEstado(EstadoActividadEnum.ACTIVO.getId());
    }

    //**************************** MÉTODOS PROPIOS DEL BEAN ********************
    /**
     * Método que obtiene el id del objeto contenido dentro del data table
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private Coordinacion obtenerObjeto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent("idCoordinacionOutputText");
        Short id = (Short) componente.getValueExpression("value").getValue(context.getELContext());
        return coordinaciones.get(coordinaciones.indexOf(new Coordinacion(id)));
    }

    /**
     * Método que obtiene el objeto seleccionado por el usuario
     *
     * @param event
     */
    public void seleccionarCoordinacion(ActionEvent event) {
        coordinacionSeleccionada = obtenerObjeto(event);

        nombreCoordinacion = coordinacionSeleccionada.getNombre();
        gerenciaSeleccionado = coordinacionSeleccionada.getIdGerencia().getIdGerencia().toString();
    }

    /**
     * Método que toma un mensaje enviado y lo pasa al contexto para que sea
     * mostrado en la interfaz gráfica del usuario
     *
     * @param String, mensaje con el error que se desea mostrar.
     */
    private void incluirMensaje(String error) {
//        FacesContext.getCurrentInstance().addMessage(null, 
//            new FacesMessage(FacesMessage.SEVERITY_INFO, error, null));
        mensaje = error;
    }

    /**
     * Método que valida todos los campos, incluye el mensaje de error en el
     * contexto y retorna una respuesta dependiendo de los que encuentre en las
     * validaciones
     *
     * @return boolean, indicando si los campos del formulario son correctos o
     * no
     */
    private boolean isCamposInvalidos() {
        if (nombreCoordinacion == null || nombreCoordinacion.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorNombreCoordinacion");
            incluirMensaje(error);
            return true;
        }
        if (gerenciaSeleccionado == null || gerenciaSeleccionado.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorGerencia");
            incluirMensaje(error);
            return true;
        }
        return false;
    }

    /**
     * Método que borra los campos cuando se han hecho modificaciones
     */
    private void borrarCampos() {
        coordinacionSeleccionada = null;
        gerenciaSeleccionado = null;
        nombreCoordinacion = null;
    }

    //*********************************** GETTERS Y SETTERS *******************************
    public String getNombreCoordinacion() {
        return nombreCoordinacion;
    }

    public void setNombreCoordinacion(String nombreCoordinacion) {
        this.nombreCoordinacion = nombreCoordinacion;
    }

    public List<Coordinacion> getCoordinaciones() {
        return coordinaciones;
    }

    public void setCoordinaciones(List<Coordinacion> coordinaciones) {
        this.coordinaciones = coordinaciones;
    }

    public List<SelectItem> getGerenciasItems() {
        return gerenciasItems;
    }

    public void setGerenciasItems(List<SelectItem> gerenciasItems) {
        this.gerenciasItems = gerenciasItems;
    }

    public String getGerenciaSeleccionado() {
        return gerenciaSeleccionado;
    }

    public void setGerenciaSeleccionado(String gerenciaSeleccionado) {
        this.gerenciaSeleccionado = gerenciaSeleccionado;
    }

    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

}
